#文档字符串

def getrecoder():

    '''该函数是返回用户名字和年龄'''

    name = 'abc'

    age = 26

    return name,age

print(getrecoder.__doc__)

#这个属性是可以修改的

getrecoder.__doc__ = '修改后'
print(getrecoder.__doc__)


# 2、函数的属性
# 每个函数都有个默认的字典  __dict__


# 3、函数的本质是对象。可以被调用的函数，都会继承了可调用的方法 call，所以可以使用函数callable 来检查函数是否可以被调用

def recoder(strname,*,age):
    print('年龄：',strname,'年纪：',age)

print(callable(recoder))


# 3.1 函数的分类
    # 在用户的角度讲：python内置函数，用户自己定义的函数

    # 从功能的角度： 生成器函数，一般函数

    # 从形式的角度： 普通函数（使用def来定义）、匿名函数（使用lambda 关键字来定义）、可迭代函数（属于一种特殊的内置函数）、递归函数（自己调用自己的函数）、偏函数（使用partial关键字来定义）

# 星号方式定义参数与调用方式

def recoder1(strname,*,age):
    print('姓名：',strname,'年纪：',age)

recoder1('王迎',age=89)

# 带默认实参的列表方式
# 有默认值的形参一定要写在没有默认值的形参后面，否则报错

def recoder2(strname,age=32):
    print('姓名：',strname,'age：',age)

recoder2('王迎',29)
recoder2('傻吊')

# 通过元组或列表的解包参数的方式

def recoder3(*person):
    print('姓名：',person[0],'年龄：',person[1])

list1 = ['姓名',23]
recoder3(*list1)
recoder3('姓名',23)

# 通过字典的解包参数方式

def recoder4(**person):
    print('姓名',person['name'],'年龄：',person['age'])

recoder4(name='王迎',age=28)

dict1 = {'name':'王迎','age':28}

recoder4(**dict1)

# 在函数调用前检查参数 isinstance














# 偏函数

# 例如，我们要将2进制数转换成10进制，就需要自己写一个方法 def int2(x,base=2)  return int(x,base)
# 而有了偏函数，我们就可以直接在模块中创建

import functools

int2 = functools.partial(int,base=2)
print(int2('1010101'))




